﻿// This code is distributed under MIT license. Copyright (c) 2013 George Mamaladze
// See license.txt or http://opensource.org/licenses/mit-license.php
using System.Collections.Generic;
using NUnit.Framework;

namespace Gma.DataStructures.StringSearch.Test
{
    public class SuffixTrieTest
    {

        protected ITrie<int> Trie { get; private set; }

        [TestFixtureSetUp]
        public virtual void Setup()
        {
            Trie = CreateTrie();
            for (int i = 0; i < Words20.Length; i++)
            {
                Trie.Add(Words20[i], i);
            }
        }

        protected virtual ITrie<int> CreateTrie()
        {
            return new PatriciaSuffixTrie<int>(1);
        }

        public string[] Words20 = new[] {
                                            "overcontribution",
                                            "overcontribute",
                                            "overcontraction",
                                            "s",
                                            "wershest",
                                            "wersher",
                                            "inblown",
                                            "inblow",
                                            "inbirth",
                                            "farmy",
                                            "farmy",
                                            "farmtown",
                                            "polyadelphian",
                                            "polyad",
                                            "polyacoustics",
                                            "architis",
                                            "architis",
                                            "architecturesque",
                                            "magazinable",
                                            "magas"
                                        };

        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ov", new[] { 0, 1, 2 })]
        [TestCase("ove", new[] { 0, 1, 2 })]
        [TestCase("over", new[] { 0, 1, 2 })]
        [TestCase("overc", new[] { 0, 1, 2 })]
        [TestCase("overco", new[] { 0, 1, 2 })]
        [TestCase("overcon", new[] { 0, 1, 2 })]
        [TestCase("overcont", new[] { 0, 1, 2 })]
        [TestCase("overcontr", new[] { 0, 1, 2 })]
        [TestCase("overcontri", new[] { 0, 1 })]
        [TestCase("overcontrib", new[] { 0, 1 })]
        [TestCase("overcontribu", new[] { 0, 1 })]
        [TestCase("overcontribut", new[] { 0, 1 })]
        [TestCase("overcontributi", new[] { 0 })]
        [TestCase("overcontributio", new[] { 0 })]
        [TestCase("v", new[] { 0, 1, 2 })]
        [TestCase("ve", new[] { 0, 1, 2 })]
        [TestCase("ver", new[] { 0, 1, 2 })]
        [TestCase("verc", new[] { 0, 1, 2 })]
        [TestCase("verco", new[] { 0, 1, 2 })]
        [TestCase("vercon", new[] { 0, 1, 2 })]
        [TestCase("vercont", new[] { 0, 1, 2 })]
        [TestCase("vercontr", new[] { 0, 1, 2 })]
        [TestCase("vercontri", new[] { 0, 1 })]
        [TestCase("vercontrib", new[] { 0, 1 })]
        [TestCase("vercontribu", new[] { 0, 1 })]
        [TestCase("vercontribut", new[] { 0, 1 })]
        [TestCase("vercontributi", new[] { 0 })]
        [TestCase("vercontributio", new[] { 0 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("er", new[] { 0, 1, 2, 4, 5 })]
        [TestCase("erc", new[] { 0, 1, 2 })]
        [TestCase("erco", new[] { 0, 1, 2 })]
        [TestCase("ercon", new[] { 0, 1, 2 })]
        [TestCase("ercont", new[] { 0, 1, 2 })]
        [TestCase("ercontr", new[] { 0, 1, 2 })]
        [TestCase("ercontri", new[] { 0, 1 })]
        [TestCase("ercontrib", new[] { 0, 1 })]
        [TestCase("ercontribu", new[] { 0, 1 })]
        [TestCase("ercontribut", new[] { 0, 1 })]
        [TestCase("ercontributi", new[] { 0 })]
        [TestCase("ercontributio", new[] { 0 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rco", new[] { 0, 1, 2 })]
        [TestCase("rcon", new[] { 0, 1, 2 })]
        [TestCase("rcont", new[] { 0, 1, 2 })]
        [TestCase("rcontr", new[] { 0, 1, 2 })]
        [TestCase("rcontri", new[] { 0, 1 })]
        [TestCase("rcontrib", new[] { 0, 1 })]
        [TestCase("rcontribu", new[] { 0, 1 })]
        [TestCase("rcontribut", new[] { 0, 1 })]
        [TestCase("rcontributi", new[] { 0 })]
        [TestCase("rcontributio", new[] { 0 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("co", new[] { 0, 1, 2, 14 })]
        [TestCase("con", new[] { 0, 1, 2 })]
        [TestCase("cont", new[] { 0, 1, 2 })]
        [TestCase("contr", new[] { 0, 1, 2 })]
        [TestCase("contri", new[] { 0, 1 })]
        [TestCase("contrib", new[] { 0, 1 })]
        [TestCase("contribu", new[] { 0, 1 })]
        [TestCase("contribut", new[] { 0, 1 })]
        [TestCase("contributi", new[] { 0 })]
        [TestCase("contributio", new[] { 0 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("on", new[] { 0, 1, 2 })]
        [TestCase("ont", new[] { 0, 1, 2 })]
        [TestCase("ontr", new[] { 0, 1, 2 })]
        [TestCase("ontri", new[] { 0, 1 })]
        [TestCase("ontrib", new[] { 0, 1 })]
        [TestCase("ontribu", new[] { 0, 1 })]
        [TestCase("ontribut", new[] { 0, 1 })]
        [TestCase("ontributi", new[] { 0 })]
        [TestCase("ontributio", new[] { 0 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nt", new[] { 0, 1, 2 })]
        [TestCase("ntr", new[] { 0, 1, 2 })]
        [TestCase("ntri", new[] { 0, 1 })]
        [TestCase("ntrib", new[] { 0, 1 })]
        [TestCase("ntribu", new[] { 0, 1 })]
        [TestCase("ntribut", new[] { 0, 1 })]
        [TestCase("ntributi", new[] { 0 })]
        [TestCase("ntributio", new[] { 0 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("tr", new[] { 0, 1, 2 })]
        [TestCase("tri", new[] { 0, 1 })]
        [TestCase("trib", new[] { 0, 1 })]
        [TestCase("tribu", new[] { 0, 1 })]
        [TestCase("tribut", new[] { 0, 1 })]
        [TestCase("tributi", new[] { 0 })]
        [TestCase("tributio", new[] { 0 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("ri", new[] { 0, 1 })]
        [TestCase("rib", new[] { 0, 1 })]
        [TestCase("ribu", new[] { 0, 1 })]
        [TestCase("ribut", new[] { 0, 1 })]
        [TestCase("ributi", new[] { 0 })]
        [TestCase("ributio", new[] { 0 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("ib", new[] { 0, 1 })]
        [TestCase("ibu", new[] { 0, 1 })]
        [TestCase("ibut", new[] { 0, 1 })]
        [TestCase("ibuti", new[] { 0 })]
        [TestCase("ibutio", new[] { 0 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bu", new[] { 0, 1 })]
        [TestCase("but", new[] { 0, 1 })]
        [TestCase("buti", new[] { 0 })]
        [TestCase("butio", new[] { 0 })]
        [TestCase("u", new[] { 0, 1, 14, 17 })]
        [TestCase("ut", new[] { 0, 1 })]
        [TestCase("uti", new[] { 0 })]
        [TestCase("utio", new[] { 0 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("ti", new[] { 0, 2, 14, 15, 16 })]
        [TestCase("tio", new[] { 0, 2 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("io", new[] { 0, 2 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ov", new[] { 0, 1, 2 })]
        [TestCase("ove", new[] { 0, 1, 2 })]
        [TestCase("over", new[] { 0, 1, 2 })]
        [TestCase("overc", new[] { 0, 1, 2 })]
        [TestCase("overco", new[] { 0, 1, 2 })]
        [TestCase("overcon", new[] { 0, 1, 2 })]
        [TestCase("overcont", new[] { 0, 1, 2 })]
        [TestCase("overcontr", new[] { 0, 1, 2 })]
        [TestCase("overcontri", new[] { 0, 1 })]
        [TestCase("overcontrib", new[] { 0, 1 })]
        [TestCase("overcontribu", new[] { 0, 1 })]
        [TestCase("overcontribut", new[] { 0, 1 })]
        [TestCase("v", new[] { 0, 1, 2 })]
        [TestCase("ve", new[] { 0, 1, 2 })]
        [TestCase("ver", new[] { 0, 1, 2 })]
        [TestCase("verc", new[] { 0, 1, 2 })]
        [TestCase("verco", new[] { 0, 1, 2 })]
        [TestCase("vercon", new[] { 0, 1, 2 })]
        [TestCase("vercont", new[] { 0, 1, 2 })]
        [TestCase("vercontr", new[] { 0, 1, 2 })]
        [TestCase("vercontri", new[] { 0, 1 })]
        [TestCase("vercontrib", new[] { 0, 1 })]
        [TestCase("vercontribu", new[] { 0, 1 })]
        [TestCase("vercontribut", new[] { 0, 1 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("er", new[] { 0, 1, 2, 4, 5 })]
        [TestCase("erc", new[] { 0, 1, 2 })]
        [TestCase("erco", new[] { 0, 1, 2 })]
        [TestCase("ercon", new[] { 0, 1, 2 })]
        [TestCase("ercont", new[] { 0, 1, 2 })]
        [TestCase("ercontr", new[] { 0, 1, 2 })]
        [TestCase("ercontri", new[] { 0, 1 })]
        [TestCase("ercontrib", new[] { 0, 1 })]
        [TestCase("ercontribu", new[] { 0, 1 })]
        [TestCase("ercontribut", new[] { 0, 1 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rco", new[] { 0, 1, 2 })]
        [TestCase("rcon", new[] { 0, 1, 2 })]
        [TestCase("rcont", new[] { 0, 1, 2 })]
        [TestCase("rcontr", new[] { 0, 1, 2 })]
        [TestCase("rcontri", new[] { 0, 1 })]
        [TestCase("rcontrib", new[] { 0, 1 })]
        [TestCase("rcontribu", new[] { 0, 1 })]
        [TestCase("rcontribut", new[] { 0, 1 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("co", new[] { 0, 1, 2, 14 })]
        [TestCase("con", new[] { 0, 1, 2 })]
        [TestCase("cont", new[] { 0, 1, 2 })]
        [TestCase("contr", new[] { 0, 1, 2 })]
        [TestCase("contri", new[] { 0, 1 })]
        [TestCase("contrib", new[] { 0, 1 })]
        [TestCase("contribu", new[] { 0, 1 })]
        [TestCase("contribut", new[] { 0, 1 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("on", new[] { 0, 1, 2 })]
        [TestCase("ont", new[] { 0, 1, 2 })]
        [TestCase("ontr", new[] { 0, 1, 2 })]
        [TestCase("ontri", new[] { 0, 1 })]
        [TestCase("ontrib", new[] { 0, 1 })]
        [TestCase("ontribu", new[] { 0, 1 })]
        [TestCase("ontribut", new[] { 0, 1 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nt", new[] { 0, 1, 2 })]
        [TestCase("ntr", new[] { 0, 1, 2 })]
        [TestCase("ntri", new[] { 0, 1 })]
        [TestCase("ntrib", new[] { 0, 1 })]
        [TestCase("ntribu", new[] { 0, 1 })]
        [TestCase("ntribut", new[] { 0, 1 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("tr", new[] { 0, 1, 2 })]
        [TestCase("tri", new[] { 0, 1 })]
        [TestCase("trib", new[] { 0, 1 })]
        [TestCase("tribu", new[] { 0, 1 })]
        [TestCase("tribut", new[] { 0, 1 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("ri", new[] { 0, 1 })]
        [TestCase("rib", new[] { 0, 1 })]
        [TestCase("ribu", new[] { 0, 1 })]
        [TestCase("ribut", new[] { 0, 1 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("ib", new[] { 0, 1 })]
        [TestCase("ibu", new[] { 0, 1 })]
        [TestCase("ibut", new[] { 0, 1 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bu", new[] { 0, 1 })]
        [TestCase("but", new[] { 0, 1 })]
        [TestCase("u", new[] { 0, 1, 14, 17 })]
        [TestCase("ut", new[] { 0, 1 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ov", new[] { 0, 1, 2 })]
        [TestCase("ove", new[] { 0, 1, 2 })]
        [TestCase("over", new[] { 0, 1, 2 })]
        [TestCase("overc", new[] { 0, 1, 2 })]
        [TestCase("overco", new[] { 0, 1, 2 })]
        [TestCase("overcon", new[] { 0, 1, 2 })]
        [TestCase("overcont", new[] { 0, 1, 2 })]
        [TestCase("overcontr", new[] { 0, 1, 2 })]
        [TestCase("overcontra", new[] { 2 })]
        [TestCase("overcontrac", new[] { 2 })]
        [TestCase("overcontract", new[] { 2 })]
        [TestCase("overcontracti", new[] { 2 })]
        [TestCase("overcontractio", new[] { 2 })]
        [TestCase("v", new[] { 0, 1, 2 })]
        [TestCase("ve", new[] { 0, 1, 2 })]
        [TestCase("ver", new[] { 0, 1, 2 })]
        [TestCase("verc", new[] { 0, 1, 2 })]
        [TestCase("verco", new[] { 0, 1, 2 })]
        [TestCase("vercon", new[] { 0, 1, 2 })]
        [TestCase("vercont", new[] { 0, 1, 2 })]
        [TestCase("vercontr", new[] { 0, 1, 2 })]
        [TestCase("vercontra", new[] { 2 })]
        [TestCase("vercontrac", new[] { 2 })]
        [TestCase("vercontract", new[] { 2 })]
        [TestCase("vercontracti", new[] { 2 })]
        [TestCase("vercontractio", new[] { 2 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("er", new[] { 0, 1, 2, 4, 5 })]
        [TestCase("erc", new[] { 0, 1, 2 })]
        [TestCase("erco", new[] { 0, 1, 2 })]
        [TestCase("ercon", new[] { 0, 1, 2 })]
        [TestCase("ercont", new[] { 0, 1, 2 })]
        [TestCase("ercontr", new[] { 0, 1, 2 })]
        [TestCase("ercontra", new[] { 2 })]
        [TestCase("ercontrac", new[] { 2 })]
        [TestCase("ercontract", new[] { 2 })]
        [TestCase("ercontracti", new[] { 2 })]
        [TestCase("ercontractio", new[] { 2 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rco", new[] { 0, 1, 2 })]
        [TestCase("rcon", new[] { 0, 1, 2 })]
        [TestCase("rcont", new[] { 0, 1, 2 })]
        [TestCase("rcontr", new[] { 0, 1, 2 })]
        [TestCase("rcontra", new[] { 2 })]
        [TestCase("rcontrac", new[] { 2 })]
        [TestCase("rcontract", new[] { 2 })]
        [TestCase("rcontracti", new[] { 2 })]
        [TestCase("rcontractio", new[] { 2 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("co", new[] { 0, 1, 2, 14 })]
        [TestCase("con", new[] { 0, 1, 2 })]
        [TestCase("cont", new[] { 0, 1, 2 })]
        [TestCase("contr", new[] { 0, 1, 2 })]
        [TestCase("contra", new[] { 2 })]
        [TestCase("contrac", new[] { 2 })]
        [TestCase("contract", new[] { 2 })]
        [TestCase("contracti", new[] { 2 })]
        [TestCase("contractio", new[] { 2 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("on", new[] { 0, 1, 2 })]
        [TestCase("ont", new[] { 0, 1, 2 })]
        [TestCase("ontr", new[] { 0, 1, 2 })]
        [TestCase("ontra", new[] { 2 })]
        [TestCase("ontrac", new[] { 2 })]
        [TestCase("ontract", new[] { 2 })]
        [TestCase("ontracti", new[] { 2 })]
        [TestCase("ontractio", new[] { 2 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nt", new[] { 0, 1, 2 })]
        [TestCase("ntr", new[] { 0, 1, 2 })]
        [TestCase("ntra", new[] { 2 })]
        [TestCase("ntrac", new[] { 2 })]
        [TestCase("ntract", new[] { 2 })]
        [TestCase("ntracti", new[] { 2 })]
        [TestCase("ntractio", new[] { 2 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("tr", new[] { 0, 1, 2 })]
        [TestCase("tra", new[] { 2 })]
        [TestCase("trac", new[] { 2 })]
        [TestCase("tract", new[] { 2 })]
        [TestCase("tracti", new[] { 2 })]
        [TestCase("tractio", new[] { 2 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("ra", new[] { 2 })]
        [TestCase("rac", new[] { 2 })]
        [TestCase("ract", new[] { 2 })]
        [TestCase("racti", new[] { 2 })]
        [TestCase("ractio", new[] { 2 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ac", new[] { 2, 14 })]
        [TestCase("act", new[] { 2 })]
        [TestCase("acti", new[] { 2 })]
        [TestCase("actio", new[] { 2 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("ct", new[] { 2, 17 })]
        [TestCase("cti", new[] { 2 })]
        [TestCase("ctio", new[] { 2 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("ti", new[] { 0, 2, 14, 15, 16 })]
        [TestCase("tio", new[] { 0, 2 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("io", new[] { 0, 2 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("w", new[] { 4, 5, 6, 7, 11 })]
        [TestCase("we", new[] { 4, 5 })]
        [TestCase("wer", new[] { 4, 5 })]
        [TestCase("wers", new[] { 4, 5 })]
        [TestCase("wersh", new[] { 4, 5 })]
        [TestCase("wershe", new[] { 4, 5 })]
        [TestCase("wershes", new[] { 4 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("er", new[] { 0, 1, 2, 4, 5 })]
        [TestCase("ers", new[] { 4, 5 })]
        [TestCase("ersh", new[] { 4, 5 })]
        [TestCase("ershe", new[] { 4, 5 })]
        [TestCase("ershes", new[] { 4 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rs", new[] { 4, 5 })]
        [TestCase("rsh", new[] { 4, 5 })]
        [TestCase("rshe", new[] { 4, 5 })]
        [TestCase("rshes", new[] { 4 })]
        [TestCase("s", new[] { 3, 4, 5, 14, 15, 16, 17, 19 })]
        [TestCase("sh", new[] { 4, 5 })]
        [TestCase("she", new[] { 4, 5 })]
        [TestCase("shes", new[] { 4 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("he", new[] { 4, 5 })]
        [TestCase("hes", new[] { 4 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("es", new[] { 4, 17 })]
        [TestCase("s", new[] { 3, 4, 5, 14, 15, 16, 17, 19 })]
        [TestCase("w", new[] { 4, 5, 6, 7, 11 })]
        [TestCase("we", new[] { 4, 5 })]
        [TestCase("wer", new[] { 4, 5 })]
        [TestCase("wers", new[] { 4, 5 })]
        [TestCase("wersh", new[] { 4, 5 })]
        [TestCase("wershe", new[] { 4, 5 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("er", new[] { 0, 1, 2, 4, 5 })]
        [TestCase("ers", new[] { 4, 5 })]
        [TestCase("ersh", new[] { 4, 5 })]
        [TestCase("ershe", new[] { 4, 5 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rs", new[] { 4, 5 })]
        [TestCase("rsh", new[] { 4, 5 })]
        [TestCase("rshe", new[] { 4, 5 })]
        [TestCase("s", new[] { 3, 4, 5, 14, 15, 16, 17, 19 })]
        [TestCase("sh", new[] { 4, 5 })]
        [TestCase("she", new[] { 4, 5 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("he", new[] { 4, 5 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("in", new[] { 6, 7, 8, 18 })]
        [TestCase("inb", new[] { 6, 7, 8 })]
        [TestCase("inbl", new[] { 6, 7 })]
        [TestCase("inblo", new[] { 6, 7 })]
        [TestCase("inblow", new[] { 6, 7 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nb", new[] { 6, 7, 8 })]
        [TestCase("nbl", new[] { 6, 7 })]
        [TestCase("nblo", new[] { 6, 7 })]
        [TestCase("nblow", new[] { 6, 7 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bl", new[] { 6, 7, 18 })]
        [TestCase("blo", new[] { 6, 7 })]
        [TestCase("blow", new[] { 6, 7 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("lo", new[] { 6, 7 })]
        [TestCase("low", new[] { 6, 7 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ow", new[] { 6, 7, 11 })]
        [TestCase("w", new[] { 4, 5, 6, 7, 11 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("in", new[] { 6, 7, 8, 18 })]
        [TestCase("inb", new[] { 6, 7, 8 })]
        [TestCase("inbl", new[] { 6, 7 })]
        [TestCase("inblo", new[] { 6, 7 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nb", new[] { 6, 7, 8 })]
        [TestCase("nbl", new[] { 6, 7 })]
        [TestCase("nblo", new[] { 6, 7 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bl", new[] { 6, 7, 18 })]
        [TestCase("blo", new[] { 6, 7 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("lo", new[] { 6, 7 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("in", new[] { 6, 7, 8, 18 })]
        [TestCase("inb", new[] { 6, 7, 8 })]
        [TestCase("inbi", new[] { 8 })]
        [TestCase("inbir", new[] { 8 })]
        [TestCase("inbirt", new[] { 8 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("nb", new[] { 6, 7, 8 })]
        [TestCase("nbi", new[] { 8 })]
        [TestCase("nbir", new[] { 8 })]
        [TestCase("nbirt", new[] { 8 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bi", new[] { 8 })]
        [TestCase("bir", new[] { 8 })]
        [TestCase("birt", new[] { 8 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("ir", new[] { 8 })]
        [TestCase("irt", new[] { 8 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rt", new[] { 8 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("f", new[] { 9, 10, 11 })]
        [TestCase("fa", new[] { 9, 10, 11 })]
        [TestCase("far", new[] { 9, 10, 11 })]
        [TestCase("farm", new[] { 9, 10, 11 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arm", new[] { 9, 10, 11 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rm", new[] { 9, 10, 11 })]
        [TestCase("m", new[] { 9, 10, 11, 18, 19 })]
        [TestCase("f", new[] { 9, 10, 11 })]
        [TestCase("fa", new[] { 9, 10, 11 })]
        [TestCase("far", new[] { 9, 10, 11 })]
        [TestCase("farm", new[] { 9, 10, 11 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arm", new[] { 9, 10, 11 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rm", new[] { 9, 10, 11 })]
        [TestCase("m", new[] { 9, 10, 11, 18, 19 })]
        [TestCase("f", new[] { 9, 10, 11 })]
        [TestCase("fa", new[] { 9, 10, 11 })]
        [TestCase("far", new[] { 9, 10, 11 })]
        [TestCase("farm", new[] { 9, 10, 11 })]
        [TestCase("farmt", new[] { 11 })]
        [TestCase("farmto", new[] { 11 })]
        [TestCase("farmtow", new[] { 11 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arm", new[] { 9, 10, 11 })]
        [TestCase("armt", new[] { 11 })]
        [TestCase("armto", new[] { 11 })]
        [TestCase("armtow", new[] { 11 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rm", new[] { 9, 10, 11 })]
        [TestCase("rmt", new[] { 11 })]
        [TestCase("rmto", new[] { 11 })]
        [TestCase("rmtow", new[] { 11 })]
        [TestCase("m", new[] { 9, 10, 11, 18, 19 })]
        [TestCase("mt", new[] { 11 })]
        [TestCase("mto", new[] { 11 })]
        [TestCase("mtow", new[] { 11 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("to", new[] { 11 })]
        [TestCase("tow", new[] { 11 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ow", new[] { 6, 7, 11 })]
        [TestCase("w", new[] { 4, 5, 6, 7, 11 })]
        [TestCase("p", new[] { 12, 13, 14 })]
        [TestCase("po", new[] { 12, 13, 14 })]
        [TestCase("pol", new[] { 12, 13, 14 })]
        [TestCase("poly", new[] { 12, 13, 14 })]
        [TestCase("polya", new[] { 12, 13, 14 })]
        [TestCase("polyad", new[] { 12, 13 })]
        [TestCase("polyade", new[] { 12 })]
        [TestCase("polyadel", new[] { 12 })]
        [TestCase("polyadelp", new[] { 12 })]
        [TestCase("polyadelph", new[] { 12 })]
        [TestCase("polyadelphi", new[] { 12 })]
        [TestCase("polyadelphia", new[] { 12 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ol", new[] { 12, 13, 14 })]
        [TestCase("oly", new[] { 12, 13, 14 })]
        [TestCase("olya", new[] { 12, 13, 14 })]
        [TestCase("olyad", new[] { 12, 13 })]
        [TestCase("olyade", new[] { 12 })]
        [TestCase("olyadel", new[] { 12 })]
        [TestCase("olyadelp", new[] { 12 })]
        [TestCase("olyadelph", new[] { 12 })]
        [TestCase("olyadelphi", new[] { 12 })]
        [TestCase("olyadelphia", new[] { 12 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("ly", new[] { 12, 13, 14 })]
        [TestCase("lya", new[] { 12, 13, 14 })]
        [TestCase("lyad", new[] { 12, 13 })]
        [TestCase("lyade", new[] { 12 })]
        [TestCase("lyadel", new[] { 12 })]
        [TestCase("lyadelp", new[] { 12 })]
        [TestCase("lyadelph", new[] { 12 })]
        [TestCase("lyadelphi", new[] { 12 })]
        [TestCase("lyadelphia", new[] { 12 })]
        [TestCase("y", new[] { 9, 10, 12, 13, 14 })]
        [TestCase("ya", new[] { 12, 13, 14 })]
        [TestCase("yad", new[] { 12, 13 })]
        [TestCase("yade", new[] { 12 })]
        [TestCase("yadel", new[] { 12 })]
        [TestCase("yadelp", new[] { 12 })]
        [TestCase("yadelph", new[] { 12 })]
        [TestCase("yadelphi", new[] { 12 })]
        [TestCase("yadelphia", new[] { 12 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ad", new[] { 12, 13 })]
        [TestCase("ade", new[] { 12 })]
        [TestCase("adel", new[] { 12 })]
        [TestCase("adelp", new[] { 12 })]
        [TestCase("adelph", new[] { 12 })]
        [TestCase("adelphi", new[] { 12 })]
        [TestCase("adelphia", new[] { 12 })]
        [TestCase("d", new[] { 12, 13 })]
        [TestCase("de", new[] { 12 })]
        [TestCase("del", new[] { 12 })]
        [TestCase("delp", new[] { 12 })]
        [TestCase("delph", new[] { 12 })]
        [TestCase("delphi", new[] { 12 })]
        [TestCase("delphia", new[] { 12 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("el", new[] { 12 })]
        [TestCase("elp", new[] { 12 })]
        [TestCase("elph", new[] { 12 })]
        [TestCase("elphi", new[] { 12 })]
        [TestCase("elphia", new[] { 12 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("lp", new[] { 12 })]
        [TestCase("lph", new[] { 12 })]
        [TestCase("lphi", new[] { 12 })]
        [TestCase("lphia", new[] { 12 })]
        [TestCase("p", new[] { 12, 13, 14 })]
        [TestCase("ph", new[] { 12 })]
        [TestCase("phi", new[] { 12 })]
        [TestCase("phia", new[] { 12 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("hi", new[] { 12, 15, 16, 17 })]
        [TestCase("hia", new[] { 12 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("ia", new[] { 12 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("p", new[] { 12, 13, 14 })]
        [TestCase("po", new[] { 12, 13, 14 })]
        [TestCase("pol", new[] { 12, 13, 14 })]
        [TestCase("poly", new[] { 12, 13, 14 })]
        [TestCase("polya", new[] { 12, 13, 14 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ol", new[] { 12, 13, 14 })]
        [TestCase("oly", new[] { 12, 13, 14 })]
        [TestCase("olya", new[] { 12, 13, 14 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("ly", new[] { 12, 13, 14 })]
        [TestCase("lya", new[] { 12, 13, 14 })]
        [TestCase("y", new[] { 9, 10, 12, 13, 14 })]
        [TestCase("ya", new[] { 12, 13, 14 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("p", new[] { 12, 13, 14 })]
        [TestCase("po", new[] { 12, 13, 14 })]
        [TestCase("pol", new[] { 12, 13, 14 })]
        [TestCase("poly", new[] { 12, 13, 14 })]
        [TestCase("polya", new[] { 12, 13, 14 })]
        [TestCase("polyac", new[] { 14 })]
        [TestCase("polyaco", new[] { 14 })]
        [TestCase("polyacou", new[] { 14 })]
        [TestCase("polyacous", new[] { 14 })]
        [TestCase("polyacoust", new[] { 14 })]
        [TestCase("polyacousti", new[] { 14 })]
        [TestCase("polyacoustic", new[] { 14 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ol", new[] { 12, 13, 14 })]
        [TestCase("oly", new[] { 12, 13, 14 })]
        [TestCase("olya", new[] { 12, 13, 14 })]
        [TestCase("olyac", new[] { 14 })]
        [TestCase("olyaco", new[] { 14 })]
        [TestCase("olyacou", new[] { 14 })]
        [TestCase("olyacous", new[] { 14 })]
        [TestCase("olyacoust", new[] { 14 })]
        [TestCase("olyacousti", new[] { 14 })]
        [TestCase("olyacoustic", new[] { 14 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("ly", new[] { 12, 13, 14 })]
        [TestCase("lya", new[] { 12, 13, 14 })]
        [TestCase("lyac", new[] { 14 })]
        [TestCase("lyaco", new[] { 14 })]
        [TestCase("lyacou", new[] { 14 })]
        [TestCase("lyacous", new[] { 14 })]
        [TestCase("lyacoust", new[] { 14 })]
        [TestCase("lyacousti", new[] { 14 })]
        [TestCase("lyacoustic", new[] { 14 })]
        [TestCase("y", new[] { 9, 10, 12, 13, 14 })]
        [TestCase("ya", new[] { 12, 13, 14 })]
        [TestCase("yac", new[] { 14 })]
        [TestCase("yaco", new[] { 14 })]
        [TestCase("yacou", new[] { 14 })]
        [TestCase("yacous", new[] { 14 })]
        [TestCase("yacoust", new[] { 14 })]
        [TestCase("yacousti", new[] { 14 })]
        [TestCase("yacoustic", new[] { 14 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ac", new[] { 2, 14 })]
        [TestCase("aco", new[] { 14 })]
        [TestCase("acou", new[] { 14 })]
        [TestCase("acous", new[] { 14 })]
        [TestCase("acoust", new[] { 14 })]
        [TestCase("acousti", new[] { 14 })]
        [TestCase("acoustic", new[] { 14 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("co", new[] { 0, 1, 2, 14 })]
        [TestCase("cou", new[] { 14 })]
        [TestCase("cous", new[] { 14 })]
        [TestCase("coust", new[] { 14 })]
        [TestCase("cousti", new[] { 14 })]
        [TestCase("coustic", new[] { 14 })]
        [TestCase("o", new[] { 0, 1, 2, 6, 7, 11, 12, 13, 14 })]
        [TestCase("ou", new[] { 14 })]
        [TestCase("ous", new[] { 14 })]
        [TestCase("oust", new[] { 14 })]
        [TestCase("ousti", new[] { 14 })]
        [TestCase("oustic", new[] { 14 })]
        [TestCase("u", new[] { 0, 1, 14, 17 })]
        [TestCase("us", new[] { 14 })]
        [TestCase("ust", new[] { 14 })]
        [TestCase("usti", new[] { 14 })]
        [TestCase("ustic", new[] { 14 })]
        [TestCase("s", new[] { 3, 4, 5, 14, 15, 16, 17, 19 })]
        [TestCase("st", new[] { 4, 14 })]
        [TestCase("sti", new[] { 14 })]
        [TestCase("stic", new[] { 14 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("ti", new[] { 0, 2, 14, 15, 16 })]
        [TestCase("tic", new[] { 14 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("ic", new[] { 14 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arc", new[] { 15, 16, 17 })]
        [TestCase("arch", new[] { 15, 16, 17 })]
        [TestCase("archi", new[] { 15, 16, 17 })]
        [TestCase("archit", new[] { 15, 16, 17 })]
        [TestCase("architi", new[] { 15, 16 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rch", new[] { 15, 16, 17 })]
        [TestCase("rchi", new[] { 15, 16, 17 })]
        [TestCase("rchit", new[] { 15, 16, 17 })]
        [TestCase("rchiti", new[] { 15, 16 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("ch", new[] { 15, 16, 17 })]
        [TestCase("chi", new[] { 15, 16, 17 })]
        [TestCase("chit", new[] { 15, 16, 17 })]
        [TestCase("chiti", new[] { 15, 16 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("hi", new[] { 12, 15, 16, 17 })]
        [TestCase("hit", new[] { 15, 16, 17 })]
        [TestCase("hiti", new[] { 15, 16 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("it", new[] { 15, 16, 17 })]
        [TestCase("iti", new[] { 15, 16 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("ti", new[] { 0, 2, 14, 15, 16 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arc", new[] { 15, 16, 17 })]
        [TestCase("arch", new[] { 15, 16, 17 })]
        [TestCase("archi", new[] { 15, 16, 17 })]
        [TestCase("archit", new[] { 15, 16, 17 })]
        [TestCase("architi", new[] { 15, 16 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rch", new[] { 15, 16, 17 })]
        [TestCase("rchi", new[] { 15, 16, 17 })]
        [TestCase("rchit", new[] { 15, 16, 17 })]
        [TestCase("rchiti", new[] { 15, 16 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("ch", new[] { 15, 16, 17 })]
        [TestCase("chi", new[] { 15, 16, 17 })]
        [TestCase("chit", new[] { 15, 16, 17 })]
        [TestCase("chiti", new[] { 15, 16 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("hi", new[] { 12, 15, 16, 17 })]
        [TestCase("hit", new[] { 15, 16, 17 })]
        [TestCase("hiti", new[] { 15, 16 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("it", new[] { 15, 16, 17 })]
        [TestCase("iti", new[] { 15, 16 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("ti", new[] { 0, 2, 14, 15, 16 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ar", new[] { 9, 10, 11, 15, 16, 17 })]
        [TestCase("arc", new[] { 15, 16, 17 })]
        [TestCase("arch", new[] { 15, 16, 17 })]
        [TestCase("archi", new[] { 15, 16, 17 })]
        [TestCase("archit", new[] { 15, 16, 17 })]
        [TestCase("archite", new[] { 17 })]
        [TestCase("architec", new[] { 17 })]
        [TestCase("architect", new[] { 17 })]
        [TestCase("architectu", new[] { 17 })]
        [TestCase("architectur", new[] { 17 })]
        [TestCase("architecture", new[] { 17 })]
        [TestCase("architectures", new[] { 17 })]
        [TestCase("architecturesq", new[] { 17 })]
        [TestCase("architecturesqu", new[] { 17 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("rc", new[] { 0, 1, 2, 15, 16, 17 })]
        [TestCase("rch", new[] { 15, 16, 17 })]
        [TestCase("rchi", new[] { 15, 16, 17 })]
        [TestCase("rchit", new[] { 15, 16, 17 })]
        [TestCase("rchite", new[] { 17 })]
        [TestCase("rchitec", new[] { 17 })]
        [TestCase("rchitect", new[] { 17 })]
        [TestCase("rchitectu", new[] { 17 })]
        [TestCase("rchitectur", new[] { 17 })]
        [TestCase("rchitecture", new[] { 17 })]
        [TestCase("rchitectures", new[] { 17 })]
        [TestCase("rchitecturesq", new[] { 17 })]
        [TestCase("rchitecturesqu", new[] { 17 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("ch", new[] { 15, 16, 17 })]
        [TestCase("chi", new[] { 15, 16, 17 })]
        [TestCase("chit", new[] { 15, 16, 17 })]
        [TestCase("chite", new[] { 17 })]
        [TestCase("chitec", new[] { 17 })]
        [TestCase("chitect", new[] { 17 })]
        [TestCase("chitectu", new[] { 17 })]
        [TestCase("chitectur", new[] { 17 })]
        [TestCase("chitecture", new[] { 17 })]
        [TestCase("chitectures", new[] { 17 })]
        [TestCase("chitecturesq", new[] { 17 })]
        [TestCase("chitecturesqu", new[] { 17 })]
        [TestCase("h", new[] { 4, 5, 8, 12, 15, 16, 17 })]
        [TestCase("hi", new[] { 12, 15, 16, 17 })]
        [TestCase("hit", new[] { 15, 16, 17 })]
        [TestCase("hite", new[] { 17 })]
        [TestCase("hitec", new[] { 17 })]
        [TestCase("hitect", new[] { 17 })]
        [TestCase("hitectu", new[] { 17 })]
        [TestCase("hitectur", new[] { 17 })]
        [TestCase("hitecture", new[] { 17 })]
        [TestCase("hitectures", new[] { 17 })]
        [TestCase("hitecturesq", new[] { 17 })]
        [TestCase("hitecturesqu", new[] { 17 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("it", new[] { 15, 16, 17 })]
        [TestCase("ite", new[] { 17 })]
        [TestCase("itec", new[] { 17 })]
        [TestCase("itect", new[] { 17 })]
        [TestCase("itectu", new[] { 17 })]
        [TestCase("itectur", new[] { 17 })]
        [TestCase("itecture", new[] { 17 })]
        [TestCase("itectures", new[] { 17 })]
        [TestCase("itecturesq", new[] { 17 })]
        [TestCase("itecturesqu", new[] { 17 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("te", new[] { 1, 17 })]
        [TestCase("tec", new[] { 17 })]
        [TestCase("tect", new[] { 17 })]
        [TestCase("tectu", new[] { 17 })]
        [TestCase("tectur", new[] { 17 })]
        [TestCase("tecture", new[] { 17 })]
        [TestCase("tectures", new[] { 17 })]
        [TestCase("tecturesq", new[] { 17 })]
        [TestCase("tecturesqu", new[] { 17 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("ec", new[] { 17 })]
        [TestCase("ect", new[] { 17 })]
        [TestCase("ectu", new[] { 17 })]
        [TestCase("ectur", new[] { 17 })]
        [TestCase("ecture", new[] { 17 })]
        [TestCase("ectures", new[] { 17 })]
        [TestCase("ecturesq", new[] { 17 })]
        [TestCase("ecturesqu", new[] { 17 })]
        [TestCase("c", new[] { 0, 1, 2, 14, 15, 16, 17 })]
        [TestCase("ct", new[] { 2, 17 })]
        [TestCase("ctu", new[] { 17 })]
        [TestCase("ctur", new[] { 17 })]
        [TestCase("cture", new[] { 17 })]
        [TestCase("ctures", new[] { 17 })]
        [TestCase("cturesq", new[] { 17 })]
        [TestCase("cturesqu", new[] { 17 })]
        [TestCase("t", new[] { 0, 1, 2, 4, 8, 11, 14, 15, 16, 17 })]
        [TestCase("tu", new[] { 17 })]
        [TestCase("tur", new[] { 17 })]
        [TestCase("ture", new[] { 17 })]
        [TestCase("tures", new[] { 17 })]
        [TestCase("turesq", new[] { 17 })]
        [TestCase("turesqu", new[] { 17 })]
        [TestCase("u", new[] { 0, 1, 14, 17 })]
        [TestCase("ur", new[] { 17 })]
        [TestCase("ure", new[] { 17 })]
        [TestCase("ures", new[] { 17 })]
        [TestCase("uresq", new[] { 17 })]
        [TestCase("uresqu", new[] { 17 })]
        [TestCase("r", new[] { 0, 1, 2, 4, 5, 8, 9, 10, 11, 15, 16, 17 })]
        [TestCase("re", new[] { 17 })]
        [TestCase("res", new[] { 17 })]
        [TestCase("resq", new[] { 17 })]
        [TestCase("resqu", new[] { 17 })]
        [TestCase("e", new[] { 0, 1, 2, 4, 5, 12, 17, 18 })]
        [TestCase("es", new[] { 4, 17 })]
        [TestCase("esq", new[] { 17 })]
        [TestCase("esqu", new[] { 17 })]
        [TestCase("s", new[] { 3, 4, 5, 14, 15, 16, 17, 19 })]
        [TestCase("sq", new[] { 17 })]
        [TestCase("squ", new[] { 17 })]
        [TestCase("q", new[] { 17 })]
        [TestCase("qu", new[] { 17 })]
        [TestCase("u", new[] { 0, 1, 14, 17 })]
        [TestCase("m", new[] { 9, 10, 11, 18, 19 })]
        [TestCase("ma", new[] { 18, 19 })]
        [TestCase("mag", new[] { 18, 19 })]
        [TestCase("maga", new[] { 18, 19 })]
        [TestCase("magaz", new[] { 18 })]
        [TestCase("magazi", new[] { 18 })]
        [TestCase("magazin", new[] { 18 })]
        [TestCase("magazina", new[] { 18 })]
        [TestCase("magazinab", new[] { 18 })]
        [TestCase("magazinabl", new[] { 18 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ag", new[] { 18, 19 })]
        [TestCase("aga", new[] { 18, 19 })]
        [TestCase("agaz", new[] { 18 })]
        [TestCase("agazi", new[] { 18 })]
        [TestCase("agazin", new[] { 18 })]
        [TestCase("agazina", new[] { 18 })]
        [TestCase("agazinab", new[] { 18 })]
        [TestCase("agazinabl", new[] { 18 })]
        [TestCase("g", new[] { 18, 19 })]
        [TestCase("ga", new[] { 18, 19 })]
        [TestCase("gaz", new[] { 18 })]
        [TestCase("gazi", new[] { 18 })]
        [TestCase("gazin", new[] { 18 })]
        [TestCase("gazina", new[] { 18 })]
        [TestCase("gazinab", new[] { 18 })]
        [TestCase("gazinabl", new[] { 18 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("az", new[] { 18 })]
        [TestCase("azi", new[] { 18 })]
        [TestCase("azin", new[] { 18 })]
        [TestCase("azina", new[] { 18 })]
        [TestCase("azinab", new[] { 18 })]
        [TestCase("azinabl", new[] { 18 })]
        [TestCase("z", new[] { 18 })]
        [TestCase("zi", new[] { 18 })]
        [TestCase("zin", new[] { 18 })]
        [TestCase("zina", new[] { 18 })]
        [TestCase("zinab", new[] { 18 })]
        [TestCase("zinabl", new[] { 18 })]
        [TestCase("i", new[] { 0, 1, 2, 6, 7, 8, 12, 14, 15, 16, 17, 18 })]
        [TestCase("in", new[] { 6, 7, 8, 18 })]
        [TestCase("ina", new[] { 18 })]
        [TestCase("inab", new[] { 18 })]
        [TestCase("inabl", new[] { 18 })]
        [TestCase("n", new[] { 0, 1, 2, 6, 7, 8, 11, 12, 18 })]
        [TestCase("na", new[] { 18 })]
        [TestCase("nab", new[] { 18 })]
        [TestCase("nabl", new[] { 18 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ab", new[] { 18 })]
        [TestCase("abl", new[] { 18 })]
        [TestCase("b", new[] { 0, 1, 6, 7, 8, 18 })]
        [TestCase("bl", new[] { 6, 7, 18 })]
        [TestCase("l", new[] { 6, 7, 12, 13, 14, 18 })]
        [TestCase("m", new[] { 9, 10, 11, 18, 19 })]
        [TestCase("ma", new[] { 18, 19 })]
        [TestCase("mag", new[] { 18, 19 })]
        [TestCase("maga", new[] { 18, 19 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        [TestCase("ag", new[] { 18, 19 })]
        [TestCase("aga", new[] { 18, 19 })]
        [TestCase("g", new[] { 18, 19 })]
        [TestCase("ga", new[] { 18, 19 })]
        [TestCase("a", new[] { 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 })]
        public void Test(string query, IEnumerable<int> expected)
        {
            IEnumerable<int> actual = Trie.Retrieve(query);
            CollectionAssert.AreEquivalent(expected, actual);
        }


    }
}